#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

#define ERREUR(msg)		printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg);printf("\n");
#define ERREUR2(msg,params)	printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg,params);printf("\n");


int main( int argc, char *argv[] ){

	int fichier=0, nbLitteraux, nbClauses, i, taille, j, *tab, v, bon, k, min , max;
	float rapport;

	/* Si il y a un argument -h ou plus d'un */
	if( argc<=5 || !strcmp(argv[1],"-h") ){

		printf("\nUsage:\n");
		printf("\t%s <Rapport> <Nombre de litteraux> <Card min> <Card max> <Taille> [fichier de formules de cardinalite]\n", argv[0]);
		printf("Si aucun fichier est specifie on ecrit les formules dans la sortie standard\n");

		return 0;

	/* Si un fichier est specifie */
	}else if(argc>6){

		/* on remplace l'entree standard par le fichier */
		if( (fichier = open(argv[6], O_WRONLY| O_CREAT, S_IRUSR|S_IWUSR )) == -1 ){

			ERREUR2("Ne peut creer le fichier \"%s\"", argv[6]);
			return 0;

		}

		if( dup2( fichier, fileno(stdout) ) == -1 ){

			ERREUR2("Ne peut rediriger le flux de \"%s\"", argv[6]);
			return 0;

		}
	
	}

	// tailles
	rapport = atof(argv[1]);
	nbLitteraux = atoi(argv[2]);
	nbClauses = rapport * nbLitteraux;
	taille = atoi(argv[5]);
	min = atoi(argv[3]);
	max = atoi(argv[4]);

	if(taille>nbLitteraux){
		ERREUR("Rapport incompatible avec le nombre de litteraux");
		return 0;
	}

	// init rand
	srand( time(NULL)* getpid() );

	// generation
	printf("%i %i\n", nbClauses, nbLitteraux );

	for( i=0; i<nbClauses; i++ ){

		printf("( %i, { ", (min==max)?min:(rand()%(max-min+1))+min);

		// generation des var
		tab = (int *) malloc( sizeof(int)*taille );

		for( j=0; j<taille; j++ ){

			do{
				bon = 1;
				v =(rand()%nbLitteraux) + 1;
				if( rand()%2 )
					v *= -1;
				
				for( k=0; k<j; k++ )
					if( abs(tab[k])==abs(v) ){
						bon = 0;
						break;
					}
			}while(!bon);

			tab[j] = v;

		}

		// affichage
		for( j=0; j<taille-1; j++ ){

			printf("%i, ", tab[j] );

		}
		printf("%i ", tab[j] );

		free(tab);

		printf("} )\n");

	}

	// deverouillage du fichier
	close( fichier );
	
	return 0;
}

